/*
* Copyright (c) 2007, Nubo Technologies
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
*
*    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
*    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
*    * Neither the name of the Nubo Technologies nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package com.nubotech.gwt.oss.client.s3;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.Response;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
import com.google.gwt.xml.client.XMLParser;
import com.nubotech.gwt.oss.client.AccessControlPolicy;
import com.nubotech.gwt.oss.client.AccessControlPolicyCallback;
import com.nubotech.gwt.oss.client.Grant;
import com.nubotech.gwt.oss.client.Grantee;

/**
 *
 * @author jonnakkerud
 */
public class AccessControlPolicyHandler extends AwsS3CallbackHandler {
    private AccessControlPolicyCallback cb;
    
    public AccessControlPolicyHandler(AccessControlPolicyCallback cb) {
        this.cb = cb;
    }
    
    public void onResponseReceived(Request request, Response response) {
        Document doc = getXml(response);
        
        processAccessControlPolicy(doc);        
    }

    protected void processAccessControlPolicy(Document doc) {
        Element contentsElement = doc.getDocumentElement();

        XMLParser.removeWhitespace(contentsElement);
        
        // get owner
        Node owner = contentsElement.getElementsByTagName("Owner").item(0);        
        AccessControlPolicy acp = new AccessControlPolicy();
        acp.setOwnerDisplayName(getElementTextValue((Element) owner, "DisplayName"));
        acp.setOwnerId(getElementTextValue((Element) owner, "ID"));
        
        // get grants
        Element acl = (Element) contentsElement.getElementsByTagName("AccessControlList").item(0);
        NodeList list = acl.getElementsByTagName("Grant");
        for (int i = 0; i < list.getLength(); i++) {
            Node n = list.item(i);
            acp.addGrant(createGrant((Element) n));
        }        
        
        cb.onAccessControlPolicy(acp);
    }

    private Grant createGrant(Element e) {
        Grant g = new Grant();
        
        // get the permission
        g.setPermission(getElementTextValue(e, "Permission"));
        
        // get the grantee ... and determine type
        Node grantee = e.getElementsByTagName("Grantee").item(0);
        g.setGrantee(createGrantee((Element) grantee));
        
        return g;
    }

    private Grantee createGrantee(Element e) {
        String type = e.getAttribute("xsi:type");
        Grantee g = Grantee.createGrantee(type);
        
        // get the properties
        NodeList list = e.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            Node n = list.item(i);
            String value = n.getFirstChild().getNodeValue();
            g.getProperties().put(n.getNodeName(), value);
        }        
        
        return g;
    }

    public void onError(Request request, Throwable exception) {
        // TODO impl
    }
}
